[−][src]Crate rexpect
The main crate of Rexpect
Overview
Rexpect is a loose port of pexpect which itself is inspired by Don Libe's expect.
It's main components (depending on your need you can use either of those)
- session: automate stuff in Rust
- reader: a non-blocking reader with buffering, matching on strings/regex/...
- process: spawn a process in a pty
Basic example
extern crate rexpect; use rexpect::spawn; use rexpect::errors::*; fn do_ftp() -> Result<()> { let mut p = spawn("ftp speedtest.tele2.net", Some(2000))?; p.exp_regex("Name \\(.*\\):")?; p.send_line("anonymous")?; p.exp_string("Password")?; p.send_line("test")?; p.exp_string("ftp>")?; p.send_line("cd upload")?; p.exp_string("successfully changed.\r\nftp>")?; p.send_line("pwd")?; p.exp_regex("[0-9]+ \"/upload\"")?; p.send_line("exit")?; p.exp_eof()?; Ok(()) } fn main() { do_ftp().unwrap_or_else(|e| panic!("ftp job failed with {}", e)); }
Example with bash
Tip: try the chain of commands first in a bash session.
The tricky thing is to get the wait_for_prompt right.
What wait_for_prompt
actually does is seeking to the next
visible prompt. If you forgot to call this once your next call to
wait_for_prompt
comes out of sync and you're seeking to a prompt
printed "above" the last execute()
.
extern crate rexpect; use rexpect::spawn_bash; use rexpect::errors::*; fn run() -> Result<()> { let mut p = spawn_bash(Some(30_000))?; p.execute("ping 8.8.8.8", "bytes of data")?; p.send_control('z')?; p.wait_for_prompt()?; p.execute("bg", "suspended")?; p.send_line("sleep 1")?; p.wait_for_prompt()?; p.execute("fg", "continued")?; p.send_control('c')?; p.exp_string("packet loss")?; Ok(()) } fn main() { run().unwrap_or_else(|e| panic!("bash process failed with {}", e)); }
Re-exports
pub use session::spawn; |
pub use session::spawn_bash; |
pub use session::spawn_python; |
pub use session::spawn_stream; |
pub use reader::ReadUntil; |
Modules
errors | |
process | Start a process via pty |
reader | Unblocking reader which supports waiting for strings/regexes and EOF to be present |
session | Main module of rexpect: start new process and interact with it |